import os
import time

import urllib.request
from loguru import logger
import pandas as pd

from colorama import init, Fore, Style

pd.set_option('display.expand_frame_repr', False)
init(autoreset=True)

from sqlalchemy import create_engine
import datetime
# LOG_DIR = os.path.expanduser("logs/")
# LOG_FILE = os.path.join(LOG_DIR, currentDate + "read_big_csv.log")
# logger.add(LOG_FILE, rotation="2000KB", encoding='gb2312')  # 压缩成zip格式
class Tools:
    @staticmethod
    def fd_data(listTemp, n):
        for i in range(0, len(listTemp), n):
            yield listTemp[i:i + n]


    @staticmethod
    def running(title="", runfunc="", **kwargs):
        logger.success('程序开始运行。。。')
        starttime = datetime.datetime.now()
        runfunc(title)
        endtime = datetime.datetime.now()
        logger.success('程序运行时间:' + str(endtime - starttime))

    class DB:
        @staticmethod
        def get_engine_ts(user="root", pwd="123456", ipdb="127.0.0.1:3306", db="tdx", echos=False, maxdb=5):
            return create_engine("mysql+pymysql://" + user + ":" + pwd + "@" + ipdb + "/" + db + "?charset=utf8mb4",
                                 echo=echos, max_overflow=maxdb)
    @staticmethod
    def logger():
        return logger

    # 设置头部图形
    @staticmethod
    def set_title(LOG_FILE):
        fo = open("banner.txt", "r")
        # print("文件名为: ", fo.name)
        strtmp = ""
        for line in fo.readlines():  # 依次读取每行
            # line = line.strip()  # 去掉每行头尾空白
            # print("读取的数据为: %s" % (line))
            strtmp += line
        # 关闭文件
        fo.close()
        fo = open(LOG_FILE, "a")
        fo.writelines(strtmp)
        fo.close()
        return strtmp

    @staticmethod
    # 得到list 返回df
    def codelistdf():
        import tushare as ts
        ts.set_token('531f7eda35d265a43c7091a5971802aab320a80c16afb6e7164c595a')
        pro = ts.pro_api()
        df = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
        # df.to_csv("code_list.csv")
        return df

    @staticmethod
    def codelist():
        import tushare as ts
        ts.set_token('531f7eda35d265a43c7091a5971802aab320a80c16afb6e7164c595a')
        pro = ts.pro_api()
        df = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
        return df["ts_code"].values.tolist()

    @staticmethod
    def get_date():
        return time.strftime("%Y%m%d", time.localtime())

    # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CLASS Config
    class Config:
        import configparser
        def __init__(self, filename, encoding="gbk"):
            logger.info("Config:def __init__(self):" + filename + "," + encoding)
            self.cf = self.configparser.ConfigParser()
            self.cf.read(filename, encoding=encoding)  # 读取配置文件，如果写文件的绝对路径，就可以不用os模块

        def get_config(self, rootstr, txt):
            return self.cf.get(rootstr, txt)

    # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CLASS Config
    # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@FileOp@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CLASS FileOp
    class FileOp:
        @staticmethod
        def mkdir(path):
            # 引入模块
            import os
            # 去除首位空格
            path = path.strip()
            # 去除尾部 \ 符号
            path = path.rstrip("\\")
            # 判断路径是否存在# 存在     True# 不存在   False
            isExists = os.path.exists(path)
            # 判断结果
            if not isExists:
                # 如果不存在则创建目录
                # 创建目录操作函数
                os.makedirs(path)
                logger.success(path + ' 创建成功')
                return True
            else:
                # 如果目录存在则不创建，并提示目录已存在
                logger.warning(path + ' 目录已存在')
                return False

        @staticmethod
        def get_totalsize(path_add):
            size = 0
            # 遍历并装载第一层的文件和文件夹
            __list = os.listdir(path_add)
            for i in __list:
                # 拼接成完整的绝对路径
                pathfile = os.path.join(path_add, i)
                # 文件 OR NOT
                if os.path.isfile(pathfile):
                    # print(i," is FILE")# print(pathfile)# 统计文件大小
                    size += os.path.getsize(pathfile)
                # 文件夹 OR NOT
                elif os.path.isdir(pathfile):
                    # print(i," is FOLDER") # print(pathfile)# 递归统计文件夹里面的文件名称
                    size += Tools.FileOp.get_totalsize(pathfile)
            return size

        @staticmethod
        def deldir(location):
            import glob
            # Importing os and glob modules # Loop Through the folder projects all files and deleting them one by one
            for file in glob.glob(location + "/*"):
                os.remove(file)
                logger.success("Deleted " + str(file))
        # result = getTotalsize(path_add)
        # print("Total size:{}字节({}MB)".format(result, result // 1024 // 1024))  # 输出总大小

    # @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@CLASS FileOp

    class NetAPI:
        @staticmethod
        def get_data(ts_code, encoding="gbk"):
            url = "http://qt.gtimg.cn/q=" + ts_code
            # print(url)
            page = urllib.request.urlopen(url)
            html = page.read()
            html = html.decode(encoding)
            # print(html)
            return html


